package com.vip.mvc.utils.objectpool;

import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

import java.io.Closeable;
import java.io.IOException;

/**
 * Created by cloudy.xie on 17/2/16.
 */
public class MyObjectPool implements Closeable {
    private String objName;

    // 创建对象池
    private GenericObjectPool<Object> pool;
    public MyObjectPool(String objName){
        PooledObjectFactory<Object> factory = new MyPoolableObjectFactory(objName);
        pool = new GenericObjectPool<>(factory, initConfig());
    }

    private GenericObjectPoolConfig initConfig(){
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        // 最大空闲数
        poolConfig.setMaxIdle(3);
        // 最小空闲数, 池中只有一个空闲对象的时候，池会在创建一个对象，并借出一个对象，从而保证池中最小空闲数为1
        poolConfig.setMinIdle(0);
        // 最大池对象总数
        poolConfig.setMaxTotal(10);
        // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
        poolConfig.setMinEvictableIdleTimeMillis(1800000);
        // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
        poolConfig.setTimeBetweenEvictionRunsMillis(1800000 * 2L);
        // 在获取对象的时候检查有效性, 默认false
        poolConfig.setTestOnBorrow(true);
        // 在归还对象的时候检查有效性, 默认false
        poolConfig.setTestOnReturn(false);
        // 在空闲时检查有效性, 默认false
        poolConfig.setTestWhileIdle(false);
        // 最大等待时间， 默认的值为-1，表示无限等待。
        poolConfig.setMaxWaitMillis(5000);
        // 是否启用后进先出, 默认true
        poolConfig.setLifo(true);
        // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
        poolConfig.setBlockWhenExhausted(true);
        // 每次逐出检查时 逐出的最大数目 默认3
        poolConfig.setNumTestsPerEvictionRun(3);
        return poolConfig;
    }

    public Object getObject() throws Exception {
        return pool.borrowObject();
    }

    //释放资源
    public void returnObject(Object obj){
        pool.returnObject(obj);
    }

    @Override
    public void close() throws IOException {
        pool.close();
    }
}
